﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MessageQueues.MSMQ.Interface
{
    /// <summary>
    /// 队列的操作接口
    /// </summary>
    public interface IMessageQueueMethod : IMessageQueueManage
    {
        #region 属性

        /// <summary>
        /// 是否停止循环接收消息数据
        /// </summary>
        bool IsStopReceiveLoop { get; set; }

        #endregion

        #region 同步方法

        /// <summary>
        /// 发送数据到队列
        /// </summary>
        /// <typeparam name="T">发送的数据类型</typeparam>
        /// <param name="t">发送的数据对象</param>
        void Send<T>(T t);

        /// <summary>
        /// 发送多条数据
        /// </summary>
        /// <typeparam name="T">发送的数据类型</typeparam>
        /// <param name="ts">发送的数据对象集合</param>
        void Send<T>(IList<T> ts);

        /// <summary>
        /// 清空队列中包含的所有信息数据
        /// </summary>
        void Purge();

        /// <summary>
        /// 同步获取队列消息
        /// </summary>
        /// <typeparam name="T">返回的数据类型</typeparam>
        /// <param name="action">获取数据后的回调</param>
        void Receive<T>(Action<T> action) where T : class;

        /// <summary>
        /// 同步查询但不移除队列第一条数据
        /// </summary>
        /// <typeparam name="T">返回的数据类型</typeparam>
        /// <param name="action">获取数据后的回调</param>
        void Peek<T>(Action<T> action) where T : class;

        /// <summary>
        /// 获取所有消息
        /// </summary>
        /// <typeparam name="T">数据类型</typeparam>
        /// <returns>取出来的数据</returns>
        IList<T> GetAll<T>() where T : class;

        #endregion

        #region 异步操作

        /// <summary>
        /// 异步接收队列消息，并删除接收的消息数据
        /// </summary>
        /// <typeparam name="T">返回的数据类型</typeparam>
        /// <param name="action">获取数据后的回调</param>
        void ReceiveAsync<T>(Action<T> action) where T : class;

        /// <summary>
        /// 异步循环获取队列消息，调用此方法将一直接收队列数据，直到IsStopReceiveLoop被设置为true
        /// </summary>
        /// <typeparam name="T">返回的数据类型</typeparam>
        /// <param name="action">获取数据后的回调</param>
        void ReceiveAsyncLoop<T>(Action<T> action) where T : class;

        /// <summary>
        /// 启动一个没有超时设定的异步查看操作。直到队列中出现消息时，才完成此操作。
        /// </summary>
        /// <typeparam name="T">获取的消息数据的类型</typeparam>
        /// <param name="action">获取数据后的回调</param>
        void PeekAsync<T>(Action<T> action) where T : class;

        #endregion
    }
}
